import checkRole from '@/directives/role/role'
import useClipboard from 'vue-clipboard3'
import { Notification, Message } from '@arco-design/web-vue'
import { nextTick } from 'vue'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import router from '@/router'
import { useTagStore, useKeepAliveStore } from '@/store'
import tool from '@/utils/tool'

export const refreshTag = () => {
  const route = router.currentRoute.value
  const keepStore = useKeepAliveStore()
  NProgress.start()
  keepStore.removeKeepAlive(route)
  keepStore.hidden()
  nextTick(() => {
    keepStore.addKeepAlive(route)
    keepStore.display()
    NProgress.done()
  })
}

export const addTag = (tag) => {
  const tagStore = useTagStore()
  const keepStore = useKeepAliveStore()
  tagStore.addTag(tag)
  keepStore.addKeepAlive(tag)
}

export const closeTag = (tag) => {
  const tagStore = useTagStore()
  const keepStore = useKeepAliveStore()
  const t = tagStore.removeTag(tag)
  keepStore.removeKeepAlive(tag)
  router.push({ path: t.path, query: tool.getRequestParams(t.path) })
}

export const success = (title, content) => {
  Notification.success({ title, content, closable: true })
}

export const info = (title, content) => {
  Notification.info({ title, content, closable: true })
}

export const error = (title, content) => {
  Notification.error({ title, content, closable: true })
}

// 檢查角色函數
export const role = (name) => checkRole(name)

// 複製
export const copy = (text) => {
  try {
    useClipboard().toClipboard(text)
    Message.success('已成功複製到剪切板')
  } catch (e) {
    Message.error('複製失敗')
  }
}

function transitionJsonToString(jsonObj, callback) {
  // 轉換後的jsonObj受體對象
  var _jsonObj = null
  // 判斷傳入的jsonObj對象是不是字符串，如果是字符串需要先轉換為對象，再轉換為字符串，這樣做是為了保證轉換後的字符串為雙引號
  if (Object.prototype.toString.call(jsonObj) !== '[object String]') {
    try {
      _jsonObj = JSON.stringify(jsonObj)
    } catch (error) {
      // 轉換失敗錯誤信息
      console.error('您傳遞的json數據格式有誤，請核對...')
      console.error(error)
      callback(error)
    }
  } else {
    try {
      jsonObj = jsonObj.replace(/(\')/g, '"')
      _jsonObj = JSON.stringify(JSON.parse(jsonObj))
    } catch (error) {
      // 轉換失敗錯誤信息
      console.error('您傳遞的json數據格式有誤，請核對....')
      console.error(error)
      // callback(error);
    }
  }
  return _jsonObj
}

export const formatJson = (jsonObj, callback) => {
  // 正則表達式匹配規則變量
  var reg = null
  // 轉換後的字符串變量
  var formatted = ''
  // 換行縮進位數
  var pad = 0
  // 一個tab對應空格位數
  var PADDING = '  '
  // json對象轉換為字符串變量
  var jsonString = transitionJsonToString(jsonObj, callback)
  if (!jsonString) {
    return jsonString
  }
  // 存儲需要特殊處理的字符串段
  var _index = []
  // 存儲需要特殊處理的「再數組中的開始位置變量索引
  var _indexStart = null
  // 存儲需要特殊處理的「再數組中的結束位置變量索引
  var _indexEnd = null
  // 將jsonString字符串內容通過\r\n符分割成數組
  var jsonArray = []
  // 正則匹配到{,}符號則在兩邊添加回車換行
  jsonString = jsonString.replace(/([\{\}])/g, '\r\n$1\r\n')
  // 正則匹配到[,]符號則在兩邊添加回車換行
  jsonString = jsonString.replace(/([\[\]])/g, '\r\n$1\r\n')
  // 正則匹配到,符號則在兩邊添加回車換行
  jsonString = jsonString.replace(/(\,)/g, '$1\r\n')
  // 正則匹配到要超過一行的換行需要改為一行
  jsonString = jsonString.replace(/(\r\n\r\n)/g, '\r\n')
  // 正則匹配到單獨處於一行的,符號時需要去掉換行，將,置於同行
  jsonString = jsonString.replace(/\r\n\,/g, ',')
  // 特殊處理雙引號中的內容
  jsonArray = jsonString.split('\r\n')
  jsonArray.forEach(function (node, index) {
    // 獲取當前字符串段中"的數量
    var num = node.match(/\"/g) ? node.match(/\"/g).length : 0
    // 判斷num是否為奇數來確定是否需要特殊處理
    if (num % 2 && !_indexStart) {
      _indexStart = index
    }
    if (num % 2 && _indexStart && _indexStart != index) {
      _indexEnd = index
    }
    // 將需要特殊處理的字符串段的其實位置和結束位置信息存入，並對應重置開始時和結束變量
    if (_indexStart && _indexEnd) {
      _index.push({
        start: _indexStart,
        end: _indexEnd
      })
      _indexStart = null
      _indexEnd = null
    }
  })
  // 開始處理雙引號中的內容，將多餘的"去除
  _index.reverse().forEach(function (item, index) {
    var newArray = jsonArray.slice(item.start, item.end + 1)
    jsonArray.splice(item.start, item.end + 1 - item.start, newArray.join(''))
  })
  // 獎處理後的數組通過\r\n連結符重組為字符串
  jsonString = jsonArray.join('\r\n')
  // 將匹配到:後為回車換行加大括號替換為冒號加大括號
  jsonString = jsonString.replace(/\:\r\n\{/g, ':{')
  // 將匹配到:後為回車換行加中括號替換為冒號加中括號
  jsonString = jsonString.replace(/\:\r\n\[/g, ':[')
  // 將上述轉換後的字符串再次以\r\n分割成數組
  jsonArray = jsonString.split('\r\n')
  // 將轉換完成的字符串根據PADDING值來組合成最終的形態
  jsonArray.forEach(function (item, index) {
    // console.log(item);
    var i = 0
    // 表示縮進的位數，以tab作為計數單位
    var indent = 0
    // 表示縮進的位數，以空格作為計數單位
    var padding = ''
    if (item.match(/\{$/) || item.match(/\[$/)) {
      // 匹配到以{和[結尾的時候indent加1
      indent += 1
    } else if (
      item.match(/\}$/) ||
      item.match(/\]$/) ||
      item.match(/\},$/) ||
      item.match(/\],$/)
    ) {
      // 匹配到以}和]結尾的時候indent減1
      if (pad !== 0) {
        pad -= 1
      }
    } else {
      indent = 0
    }
    for (i = 0; i < pad; i++) {
      padding += PADDING
    }
    formatted += padding + item + '\n'
    pad += indent
  })
  // 返回的數據需要去除兩邊的空格
  return formatted.trim()
}

// 判斷是否彈出層全屏
export const setModalSizeEvent = (callback) => {
  callback({ isFull: window.screen.width < 768, width: window.screen.width })
}
// 加載遠程js
export const loadScript = (src, callback) => {
  const s = document.createElement('script')
  s.type = 'text/javascript'
  s.src = src
  s.onload = s.onreadystatechange = function () {
    if (
      !this.readyState ||
      this.readyState === 'loaded' ||
      this.readyState === 'complete'
    ) {
      callback && callback()
      s.onload = s.onreadystatechange = null
    }
  }
  document.body.appendChild(s)
}

// 加載遠程css
export const loadCss = (href, callback) => {
  const s = document.createElement('link')
  s.type = 'text/css'
  s.rel = 'stylesheet'
  s.media = 'all'
  s.href = href
  s.onload = s.onreadystatechange = function () {
    if (
      !this.readyState ||
      this.readyState === 'loaded' ||
      this.readyState === 'complete'
    ) {
      callback && callback()
      s.onload = s.onreadystatechange = null
    }
  }
  document.body.appendChild(s)
}

export const discount = (discount, price) => {
  return (
    (price * (discount === '0.00' || discount === 0 ? 10 : discount)) /
    10
  ).toFixed(2)
}

export const versionCompare = (v1, v2) => {
  // 將版本號轉換成數字數組
  v1 = v1.split('.')
  v2 = v2.split('.')
  // 對齊版本號的長度
  while (v1.length < v2.length) v1.push('0')
  while (v2.length < v1.length) v2.push('0')
  // 轉換成數字數組
  v1 = v1.map(Number)
  v2 = v2.map(Number)

  for (let i = 0; i < v1.length; i++) {
    if (v1[i] < v2[i]) return -1 // v1 < v2
    if (v1[i] > v2[i]) return 1 // v1 > v2
  }
  return 0 // v1 == v2
}
